<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    <script>
      /*   
    1.  解释下面代码的输出console.log(false == '0');
        两者做判断时，若有布尔类型，会先把boolean转换成number，即0 (false) 和 1 (true)；
        字符串string和number类型做比较的时候，string会转化成number。 
    
    2. 简述break，return和continue的区别？
       都可以打断循环
            break只能跳出所在的循环 循环外面的代码还能执行
            continue 跳出本次循环 下次循环继续执行
            return 跳出所在的代码 return只能在函数当中使用  函数外面不能使用return 当代码遇到return的时候 不光循环不执行  循环外面的代码也不执行
     
    3. 判断一个变量是否是数组，有哪些办法
            isArray，我们可以直接用Array.isArray来判断变量是否是数组。
            console.log(Array.isArray([1,2,3]))//true
            instanceof
            console..log([1,2,3] instanceof Array);// true

    4、数组的内置方法有哪些，其作用是什么？（5个以上）
        pop、push、cancat、shift、unshift、join、filter、map、some、everything、replace、find、splice、
        push('元素') 追加在最后 返回数组的长度。
        unshift('元素') 添加在最前 返回数组的长度。  
        pop() 删除数组中的最后一个元素删除的那个元素 没有参数
        Shift（） 删除数组中的第一个元素 没有参数
        map( )：没有return时，对数组的遍历。有return时，返回一个新数组，该新数组的元素是经过过滤(逻辑处理)过的函数。
        indexOf('元素', n)); 参数一元素，参数二元素出现的次数 返回第n次出现的索引号
        lastindexOf('元素') 存在返回元素最后一次出现的索引位置
        tostring数组转化为字符串 元素之间用逗号切割
        Join（&）分隔符 参数分割方式
        concat（‘元素’‘拼在哪个元素后’）拼接在后
        replace（ '被替换的字符' '替换后的字符' ）替换第一次出现的元素
        substr（截取字符串的起始位置，截取字符串的个数）截取
        split('符号')分割符
        tostring();转为字符串
        charAt（索引号）根据位置返回字符本身
        charcodeAt（索引号） 返回相应的索引号值的ascii码，目的：判断用户按下了哪个键
        arr[2]返回索引号的值
        map() 方法返回一个新数组,新数组中的元素为原始数组中的每个元素调用函数处理后得到的值
        Arr.every（）所有的元素通过传入的函数进行判断返回一个布尔值，如果所有的满足返回t，有一个不满足返回f
        Arr.some（）所有的元素通过传入的函数进行判断返回一个布尔值，如果只有一个的满足返回t，所有不满足返回freduce 数组进行求和
        splice() 方法可以删除从 index 处开始的0或多个元素,并且用参数列表声明中声明的一个或是多个值来代替或修改那些被删除的元素。

        4.1 arr.push(value); 在数组末尾添加一个或多个元素，并返回数组的新长度
        4.2 arr.pop(); 删除索引值最大的元素，并返回被删除的元素
        4.3 arr.shift(); 在数组添加一个或多个元素，并返回数组的新长度
                         删除索引号为0的元素，并返回删除的元素
        4.4 arr.indexOf(); 找到符合条件的元素，如果不存在，则返回-1
        4.5 arr.splice(); 通过指定的索引号和个数，提取数组的某个部分元素
        4.6 reverse   翻转数组顺序
            sort      排序，改变原来的数组
        4.7 数组转换字符串
            var arr=new Array(1,2,3,4,5);
            var str=arr.join('-');    间隔的字符串，默认为“，”
            console.log(str);//1-2-3-4-5

        5、Math对象，日期对象的内置方法有哪些？
       Math.sqrt(x)
返回一个数的平方根。
Math.round(x)
返回四舍五入后的整数。
Math.random()
返回一个 0 到 1 之间的伪随机数。
Math.max([x[, y[, …]]])
返回零到多个数值中最大值。
Math.min([x[, y[, …]]])
返回零到多个数值中最小值。
Math.pow(x, y)
返回一个数的 y 次幂。
Math.floor(x)
返回小于一个数的最大整数，即一个数向下取整后的值。
Math.ceil(x)
返回大于一个数的最小整数，即一个数向上取整后的值。
Math.abs(x)
返回一个数的绝对值。
getDate()   返回月中的第几天（从 1 到 31）。
    getDay()    返回星期几（0-6）。
    getFullYear()   返回年份。
    getHours()  返回小时（从 0-23）。
    getMilliseconds()   返回毫秒（0-999）。
    getMinutes()    返回分钟（从 0-59）。
    getMonth()  返回月份（从 0-11）。
    getSeconds()    返回秒数（从 0-59）。
    getTime()   返回自 1970 年 1 月 1 日午夜以来与指定日期的毫秒数。

        6、说明for...in与for...of
        两者都是遍历
        遍历数组，for...in拿的是数组的索引，for...of拿的是元素
        遍历对象，for...in拿的是属性名，for...of报错

        7、程序结构（执行顺序）分为几种方式？分别是什么？   
        顺序结构  分支结构  循环结构 
        分支结构： 单分支 if    双分支  if ...else   多分支  if...else if  ...else if...else    switch
        循环结构： for   while   do...while
        
        8、作用域和作用域链？
        作用域：分为全局作用域和局部作用域
     变量根据作用域的不同又分为：
              1、全局变量
              2、局部变量
        在全局作用域下声明的变量叫做全局变量（在函数外部定义的变量）
        全局变量在代码的任何位置都可以使用
        在全局作用域下var声明的变量是全局变量
        特殊情况下，在函数内不使用var声明的变量也是全局变量（不建议使用）
        在局部作用域下声明的变量叫做局部变量（在函数内部定义的变量）
        局部变量只能在该函数内部使用
        在函数内部var声明的变量是局部变量
        函数的形参实际上就是局部变量
        区别：
        全局变量：在任何一个地方都可以使用，只有在浏览器关闭时才会被销毁，因此比较占内存   生命周期长
        局部变量：只在函数内部使用，当其所在的代码块被执行时，会被初始化；当代码块运行结束后，就会被销毁，因此更节省内存空间  生命周短

        作用域链：作用域链是一层作用包裹另一层作用域,从而形成作用域链
                查询时都会从当前作用域开始查找，如果没有找到，就会向上级作用域继续查找目标标识符，每次上升一个作用域，一直到全局作用域为止



9、获取现在到2022年6月1日12时0分0秒的倒计时，请输入页面内部，（函数编程）
function countDate(date){
        let d1 =new Date();
        d1 = d1.getTime();
        let d2 = date.valueOf();
        let sub =d2 - d1;
        sub = sub / 1000;

        h = parseInt(sub / 60 / 60 % 24);
        m = parseInt(sub / 60 %24);
        s = parseInt(sub % 60);

        h =h < 10 ? '0' + h : h;
        m =m < 10 ? '0' + m : m;
        s =s < 10 ? '0' + s : s;
        return h + ':' + m + ':' +s;

}
let result = countDate(new Date('2022-06-01 12:00:00'));
console.log(result);

10、录入学生信息，其中包括姓名，性别，年龄，身高，将其放进同一个数组中，并对数组以身高从高到低进行排序。
*/
var items = [
        {name:'小王', sex: '女', age:18, tall:165},
        {name:'小名', sex: '男', age:18, tall:178},
        {name:'小张', sex: '男', age:18, tall:180},
        {name:'小红', sex: '女', age:18, tall:168},
]
 items.sort(function (a, b) {
        return (a.tall - b.tall)
      });
      console.log(items);
/* 
11、git 的常见命令 至少5个，并解释说明（10分）
代码提交：
        ①将代码提交至缓存区:git add .
        ②给本次代码提交添加备注:git commit -m "备注"  
        ③代码推送至远程仓库: git push 

        ④ git pull 拉取最新代码
        删除远程分支
        ⑤ git push origin --delete test (test是文件名可以换)
        ⑥ git branch -dr test (test是文件名可以换)
*/

// 12、把数组[5,6,3,5,5,6,8,7,8]里的元素去重。（函数加数组内置方法实现）
// let arr = [5,6,3,5,5,6,8,7,8];
// var newArr = [];
// function reverse(arr){
//     for(var i = 0; i<arr.length; i++){
//     if(newArr.indexOf(arr[i]) == -1){
//                newArr.push(arr[i]);
//            }
// }  
// }
// reverse(arr);
// console.log(newArr);

// 去重
function noRepeat(arr){
     for(var i=0;i<arr.length;i++){
         for(var j=i+1;j<arr.length;j++){
             if(arr[i]===arr[j]){
                 arr.splice(j,1);
                 //注意这里一定要j--,如果不减的话，那么删掉一个之后，
                 //后面的会往前走一位，但是索引号是往后走的，如果不减，就相当于跳过了一位
                 j--;
             }
         }
        
     } 
     return arr;
 }
var arr=[1,2,1,1,1,3,2,5,6,8,5,5,5];
var arr2=noRepeat(arr);// [1, 2, 3, 5, 6, 8]
console.log(arr2);


    </script>
</body>
</html>